package work.web;

import java.util.ArrayList;
import java.util.List;

// 1. 定义事件类
class ButtonClickEvent extends java.util.EventObject {
    private final String clickMessage;

    public ButtonClickEvent(Object source, String message) {
        super(source);
        this.clickMessage = message;
    }

    public String getClickMessage() {
        return clickMessage;
    }
}

// 2. 定义监听器接口
interface ButtonClickListener {
    void onClick(ButtonClickEvent event);
}

// 3. 实现事件源
class Button {
    private final String label;
    private final List<ButtonClickListener> listeners = new ArrayList<>();

    public Button(String label) {
        this.label = label;
    }

    // 注册监听器
    public void addClickListener(ButtonClickListener listener) {
        listeners.add(listener);
    }

    // 注销监听器
    public void removeClickListener(ButtonClickListener listener) {
        listeners.remove(listener);
    }

    // 触发事件
    public void simulateClick() {
        System.out.println("Button '" + label + "' clicked!");
        ButtonClickEvent event = new ButtonClickEvent(this, "Clicked at " + System.currentTimeMillis());
        notifyListeners(event);
    }

    // 通知所有监听器
    private void notifyListeners(ButtonClickEvent event) {
        for (ButtonClickListener listener : listeners) {
            listener.onClick(event);
        }
    }
}

// 4. 使用示例
public class EventListenerDemo {
    public static void main(String[] args) {
        // 创建事件源
        Button loginButton = new Button("Login");

        // 注册监听器（方式1：匿名内部类）
        loginButton.addClickListener(new ButtonClickListener() {
            @Override
            public void onClick(ButtonClickEvent event) {
                System.out.println("Logging in... Message: " + event.getClickMessage());
            }
        });

        // 注册监听器（方式2：Lambda表达式，Java 8+）
        loginButton.addClickListener(event -> {
            System.out.println("Performing validation...");
            // 处理登录逻辑
        });

        // 触发事件
        loginButton.simulateClick();
    }
}
